package br.ucb.sirad.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.ucb.sirad.beans.Categoria;
import br.ucb.sirad.beans.Documento;
import br.ucb.sirad.beans.TipoDocumento;
import br.ucb.sirad.beans.matriz.EstruturaMatriz.CasoUsoMatriz;

@SuppressWarnings("serial")
public class DocumentoDAO extends DAO<Documento>{
	
	private EntityManager em;
	
	public DocumentoDAO() {
		super(Documento.class);
	}
	
	public List<Documento> pesquisarPorNomePaginado(String nome,int firstResult, int maxResults){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName()+" where nome like :nome and sequencia is null ")
						.setParameter("nome", "%"+nome+"%");
		
		// Paginacao
		query = query.setFirstResult(firstResult)
				.setMaxResults(maxResults);
				
		List<Documento> lista = query.getResultList();
		em.getTransaction().commit();
		em.close();

		return lista;
	}
	
	public List<Documento> listaDocumentosSemSequenciaPaginada(int firstResult, int maxResults){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName()+" where sequencia is null ");
		
		// Paginacao
		query = query.setFirstResult(firstResult)
				.setMaxResults(maxResults);
				
		List<Documento> lista = query.getResultList();
		em.getTransaction().commit();
		em.close();

		return lista;
	}
	
	public Documento verificaSimboloExiste(TipoDocumento tipo, Long numeroSimbolo){
		Documento doc = null;
		
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName()+" where tipo = :tipo and sequencia = :numeroSimbolo ");
		
		query.setParameter("tipo", tipo);
		query.setParameter("numeroSimbolo", numeroSimbolo);

		try
		{
			doc = (Documento) query.getSingleResult();
		} catch (NoResultException e){
			doc = null;
		} 
		finally	{
			em.getTransaction().commit();
			em.close();
		}
		return doc;
	}
	
	public List<Documento> buscaDocumentosCategoria(Categoria cat){
		List<Documento> listDoc = null;
		
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName()+" where categoria = :cat and sequencia is null ");
		
		query.setParameter("cat", cat);

		try
		{
			listDoc = query.getResultList();
		} catch (NoResultException e){
			listDoc = null;
		} 
		finally	{
			em.getTransaction().commit();
			em.close();
		}
		return listDoc;
	}
	
	public List<Documento> buscaDocumentosRelacionados(Documento doc){
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery(" from "+Documento.class.getName()+" as doc where id = :docId ");
		
		query.setParameter("docId", doc.getId());

		try
		{
			doc = (Documento) query.getSingleResult();
			doc.getDocumentosRelacionados();
		} catch (NoResultException e){
			doc.setDocumentosRelacionados(null);
		} 
		finally	{
			//em.getTransaction().commit();
			em.close();
		}
		return doc.getDocumentosRelacionados();
	}	
	
	public List<Documento> buscaDocumentos(){
		List<Documento> lista = null;
		
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName()+" where sequencia is null ");
	
		lista = query.getResultList();
	
		em.getTransaction().commit();
		em.close();
		
		return lista;
	}
	
	public List<Documento> buscaTodosDocumentosTabela(){
		List<Documento> lista = null;
		
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName());
	
		lista = query.getResultList();
	
		em.getTransaction().commit();
		em.close();
		
		return lista;
	}
	
	public List<Documento> buscaTodosDocumentosRelacionados(){
		List<Documento> lista = null;
		
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("from "+Documento.class.getName()+" where id = idDoc1");
	
		lista = query.getResultList();
	
		em.getTransaction().commit();
		em.close();
		
		return lista;
	}
	
	public long buscaQuantidadeDocumentosTipo(TipoDocumento tipo){
		
		em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		Query query = em.createQuery("select count(*) from "+Documento.class.getName()+" where tipo = :tipo");
		query.setParameter("tipo", tipo);
	
		long cont = (Long) query.getSingleResult();
	
		em.getTransaction().commit();
		em.close();
		
		return cont;
	}
}
